<?php
/**
 * 動画テーブル
 *
 * @author tanaka
 * @package
 * @subpackage
 */
class Db_Table_TMovie extends Db_TableAbstract
{
	const TABLE_NAME ='t_movie';

	/**
	 *
	 * @param Container_UserFront $user
	 * @param Container_Form_MovieUpload $container
	 * @param string $tmp_file
	 * @return void
	 */
	public function insertMovieUpload(Container_UserFront $user, Container_Form_MovieUpload $container, $filename)
	{
		if(!is_readable($filename)){
			throw new AppException('アップロードされたファイルの読み込み失敗');
		}

		$data = file_get_contents($filename);

		// 解析する

		$db = $this->_db;
		$db->beginTransaction();

		try {
			$db->insert(self::TABLE_NAME, array(
					'user_id'     => $user->getUserId(),
					'status'      => C_MOVIE_STATUS_NOCONVERT,
					'title'       => $container->title,
					'summary'     => '',
					'filehash'    => File_Movie_Util::hash($data),
					'filesize'    => strlen($data),
					'filedata'    => $data,
					'publish_flg' => C_FLG_OFF,
					'create_date' => new Zend_Db_Expr('NOW()'),
					'update_date' => new Zend_Db_Expr('NOW()'),
				));

			$db->commit();

		} catch (Exception $e) {
			$db->rollBack();
			throw $e;
		}
	}

	/**
	 * ログインユーザーがアップロードした動画をすべて返す
	 *
	 * @param Container_UserFront $user
	 * @return array
	 */
	public function getAllSelfUploadMovies(Container_UserFront $user)
	{
		$db = $this->_db;
		$select = $db->select()
			->from(['u' => self::TABLE_NAME] ,array(
				'movie_id',
				'user_id',
				'status',
				'title',
				'summary',
				'genre_id',
				'subgenre_id',
				'publish_flg',
				'create_date',
				'update_date',
				'encode_date',
			))
			->joinLeft(
				['g' => 't_movie_genre'],
				'u.genre_id=g.genre_id and g.subgenre_id=' . C_MAJOR_SUBGENRE_ID,
				['genre_name' => 'name']
			)
			->joinLeft(
				['gs' => 't_movie_genre'],
				'u.genre_id=gs.genre_id and u.subgenre_id=gs.subgenre_id',
				['subgenre_name' => 'name']
			);

		return $db->fetchAll($select);
	}

	/**
	 * 主キーから1件取得
	 * @param int $movie_id
	 * @return array
	 */
	public function getByMovieId($movie_id)
	{
		$db = $this->_db;
		$select = $db->select()
			->from(self::TABLE_NAME)
			->where('movie_id = ?', $movie_id);

		return $db->fetchRow($select);
	}

	/**
	 * ユーザーがアクセス可能な場合のみレコードを返す
	 *
	 * ステータス：問答無用で変換OKのみ
	 *
	 * 投稿ユーザー＝ログインユーザーの場合 ⇒ 他の条件なし
	 *
	 * そうでない場合
	 *  ⇒ 公開中である
	 *
	 *
	 * @param Container_UserFront $user
	 * @param int $movie_id
	 * @return array
	 */
	public function getEnableAccessByMovieId(Container_UserFront $user, $movie_id)
	{
		if(!ctype_digit("{$movie_id}"))return [];

		$db = $this->_db;

		// 若干複雑なSQLなのでORマッパは使わない

		// ログインユーザーが投稿したユーザーの場合非公開でも参照可能
		$whereLoginUser = " mv.user_id={$user->getUserId()} ";

		// 他人の場合 @todo ここで表示権限を参照する。
		$whereOther = " mv.publish_flg =". C_FLG_ON . " ";

		$sql = "
				SELECT
				 mv.*,
				 mg.name as genre_name,
				 sg.name as subgenre_name
				FROM t_movie as mv
				LEFT JOIN t_movie_genre mg ON mv.genre_id=mg.genre_id AND mg.subgenre_id=". C_MAJOR_SUBGENRE_ID ."
				LEFT JOIN t_movie_genre sg ON mv.genre_id=sg.genre_id AND mg.subgenre_id=sg.subgenre_id
				WHERE mv.status= " . C_MOVIE_STATUS_OK . " AND mv.movie_id = {$movie_id} AND(
					({$whereLoginUser}) OR ({$whereOther})
				)
				";

		return $db->fetchRow($sql);
	}

	/**
	 * エンコード用に主キーから1件取得
	 *
	 * @param int $movie_id
	 * @return array
	 */
	public function getForEncodeByMovieId($movie_id, $force_flg=false)
	{
		$db = $this->_db;
		$db->beginTransaction();
		try {
			$select = $db->select()
				->from(self::TABLE_NAME)
				->where('movie_id = ?', $movie_id);

			if(!$force_flg){
				$select->where('status = ?', C_MOVIE_STATUS_NOCONVERT);
			}

			$row = $db->fetchRow($select);

			if(!$row){
				$db->rollBack();
				return [];
			}

			$db->update(self::TABLE_NAME, array(
					'status'      => C_MOVIE_STATUS_CONVERTING,
					'update_date' => new Zend_Db_Expr('NOW()'),
				), $db->quoteInto('movie_id = ?', $movie_id));

			$db->commit();

			return $row;

		} catch (Exception $e) {
			$db->rollBack();
			File_Logger::getInstance(File_Logger::TYPE_APP_EXCEPTION)->write($e->getMessage());
			return array();
		}
	}

	/**
	 * エンコード状態のアップデート
	 *
	 * @param int $movie_id
	 * @param int $status
	 * @param string $msg
	 * @return void
	 */
	public function updateEncodeStatus($movie_id, $status, $msg = '')
	{
		$db = $this->_db;
		$db->update(self::TABLE_NAME, array(
				'status' => $status,
				'update_date' => new Zend_Db_Expr('NOW()'),
				'encode_date' => new Zend_Db_Expr('NOW()'),
				'encode_msg' => $msg,
			), $db->quoteInto('movie_id = ?', $movie_id));
	}

	/**
	 * エンコードしたデータの登録
	 *
	 * @param int $movie_id
	 * @param string $data
	 * @param int $maxFrameCount
	 * @param string $thumbnailData
	 * @return void
	 */
	public function updateEncodeSuccess($movie_id, $data, $maxFrameCount, $thumbnailData)
	{
		$db = $this->_db;
		$db->update(self::TABLE_NAME, array(
			'status'      => C_MOVIE_STATUS_OK,
			'filehash'    => File_Movie_Util::hash($data),
			'filesize'    => strlen($data),
			'filedata'    => $data,
			'framecount'  => $maxFrameCount,
			'thumbnail'   => $thumbnailData,
			'update_date' => new Zend_Db_Expr('NOW()'),
			'encode_date' => new Zend_Db_Expr('NOW()'),
			'encode_msg'  => null,
		), $db->quoteInto('movie_id = ?', $movie_id));
	}
}